package com.vates.vsp.servicios.hotel;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.vates.vsp.dao.DaoBaseHotel;
import com.vates.vsp.entidades.Hotel;
import com.vates.vsp.entidades.TipoHabitacion;
import com.vates.vsp.exceptions.HotelExistException;
import com.vates.vsp.exceptions.HotelNoExistException;
import com.vates.vsp.exceptions.ValidationException;
import com.vates.vsp.util.ValidadorCampos;

@Service(value = "hotelSrv")
public class HotelServiceImpl implements HotelService {
	
	@Autowired
	private DaoBaseHotel dao;

	@Override
	public void altaHotel(Hotel hotel) throws HotelExistException, ValidationException {
		if (ValidadorCampos.validarHotel(hotel) && dao.buscarPorNombre(hotel.getNombre()) == null)
			dao.guardar(hotel);
		else
			throw new HotelExistException();
	}

	@Override
	public void bajaHotel(Hotel hotel) throws HotelNoExistException {
		if (dao.buscarPorNombre(hotel.getNombre()) != null) 
			dao.eliminar(hotel);
		else
			throw new HotelNoExistException();
	}
	
	@Override
	public void actualizarHotel(Hotel hotel, String nombreOriginal) throws HotelNoExistException, ValidationException, HotelExistException {
		if(ValidadorCampos.validarHotel(hotel) && dao.buscarPorId(hotel.getIdHotel()) != null)
			if(hotel.getNombre().equalsIgnoreCase(nombreOriginal)) 
				dao.guardar(hotel);
			else {
				if(dao.buscarPorNombre(hotel.getNombre()) == null)
					dao.guardar(hotel);
				else
					throw new HotelExistException();
			}
		else
			throw new HotelNoExistException();
	}

	@Override
	public List<Hotel> buscarTodosHoteles() {
		return dao.buscarTodos();
	}

	@Override
	public List<Hotel> buscarPorLocalidad(String localidad) {
		return dao.buscarPorLocalidad(localidad);
	}

	@Override
	public Hotel buscarHotelPorNombre(String nombreHotel)
			throws HotelNoExistException {
		if (dao.buscarPorNombre(nombreHotel) != null)
			return dao.buscarPorNombre(nombreHotel);
		else
			throw new HotelNoExistException();
	}

	@Override
	public Hotel buscarHotelPorId(Long idHotel) throws HotelNoExistException {
		if (dao.buscarPorId(idHotel) != null)
			return dao.buscarPorId(idHotel);
		else
			throw new HotelNoExistException();
	}
	
	@Override
	public void agregarTipoHabitacion(Hotel hotel, TipoHabitacion tipoHab) throws HotelNoExistException {
		if(dao.buscarPorNombre(hotel.getNombre()) != null){
			List<TipoHabitacion> list = hotel.getTipoHabitaciones();
			list.add(tipoHab);
			hotel.setTipoHabitacions(list);
			// dao.guardar(hotel);
		}
		else
			throw new HotelNoExistException();
	}
	
	@Override
	public void agregarTipoHabitacion(Hotel hotel, List<TipoHabitacion> tiposHab) throws HotelNoExistException {
		if(dao.buscarPorNombre(hotel.getNombre()) != null){
			List<TipoHabitacion> list = hotel.getTipoHabitaciones();
			list.addAll(tiposHab);
			hotel.setTipoHabitacions(list);
			// dao.guardar(hotel);
		}
		else
			throw new HotelNoExistException();
	}

	@Override
	public void eliminarTipoHabitacionDeHotel(Hotel hotel, TipoHabitacion tiposHab)  {
		if(hotel != null) {
			if(hotel.getTipoHabitaciones().remove(tiposHab));
				//System.out.println("siii");
			dao.eliminar(tiposHab);
		}
	}

	@Override
	public TipoHabitacion buscarTipoHabitacion(Long idTipoHab) {
		return dao.buscarTipoHabitacionPorId(idTipoHab);
	}
	
}
